// 矩形类
class Rectangle {

    width: number;

    height: number;

    constructor(width:number,height:number) {
        this.width = width;
        this.height = height;
    }

    area():number {
        return this.width * this.height;
    }

    per():number {
        return 2 * (this.width + this.height);
    }

    desp():void {
        console.log("我是一个长方形");
    }

}

// 子类继承父类之后，自动获取父类定义的属性和方法
class Square extends Rectangle {
    constructor(side:number) {
        // super调用父类构造方法
        super(side,side);
    }

    // 子类可以添加自己的方法
    getAngle():number {
        return 90;
    }

    // 方法重写：子类覆盖父类的方法，
    // 要求：方法名一样
    desp():void {
        // 子类可以使用super来访问父类的方法
        super.desp();
        console.log("我是一个正方形");
    }
}

let rectangle1:Rectangle = new Rectangle(20,10);

// 使用子类的实例，指向父类的引用
let rectangle2:Rectangle = new Square(20);

// 断言，把父类的引用强制转为子类（可能会出现异常）
let square = <Square>rectangle2;
console.log("角度：" + square.getAngle());

rectangle2.desp();

